<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit - Firmware API: io.c Source File</title>
<link href="mt_doxygen.css" rel="stylesheet" type="text/css" />
<link href="../resources/mt_doxytabs.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
.header {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12pt;
	color: #222222;
}
-->
</style>
</head>

<body>
<table width="800" border="0">
    <tr>
      <td colspan="3">
        <form method="get" action="http://www.google.com/search">
          <div align="right">
            <input type="text"   name="q" size="25"
              maxlength="255" value="" />
            <input type="submit" value="Search" />
            <input type="hidden" name="sitesearch" value="makingthings.com/ref/firmware/html" />
          </div>
        </form>
       </td>
    </tr>
    <tr>
      <td><div align="center"><a href="http://www.makingthings.com">
				<img src="../resources/logo_brown_medium.png" alt="MakingThings"
									width="200" height="78" border="0" align="middle" longdesc="http://www.makingthings.com" /></a></div></td>
				<td><div align="center" class="header">
      		Make Controller Kit <br />
          Firmware API
      </div></td>
      <td><div align="center"><a href="http://www.makezine.com">
					<img src="../resources/make_logo.png" alt="MAKE Zine" 
										width="164" height="73" border="0" align="middle" longdesc="http://www.makezine.com" /></a></div></td>
    </tr>
</table>
</body>
</html>
<!-- Generated by Doxygen 1.5.4 -->
<script type="text/javascript">
<!--
function changeDisplayState (e){
  var num=this.id.replace(/[^[0-9]/g,'');
  var button=this.firstChild;
  var sectionDiv=document.getElementById('dynsection'+num);
  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
    sectionDiv.style.display='block';
    button.src='open.gif';
  }else{
    sectionDiv.style.display='none';
    button.src='closed.gif';
  }
}
function initDynSections(){
  var divs=document.getElementsByTagName('div');
  var sectionCounter=1;
  for(var i=0;i<divs.length-1;i++){
    if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
      var header=divs[i];
      var section=divs[i+1];
      var button=header.firstChild;
      if (button!='IMG'){
        divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
        button=document.createElement('img');
        divs[i].insertBefore(button,divs[i].firstChild);
      }
      header.style.cursor='pointer';
      header.onclick=changeDisplayState;
      header.id='dynheader'+sectionCounter;
      button.src='closed.gif';
      section.id='dynsection'+sectionCounter;
      section.style.display='none';
      section.style.marginLeft='14px';
      sectionCounter++;
    }
  }
}
window.onload = initDynSections;
-->
</script>
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul>
</div>
<h1>io.c</h1><a href="io_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*********************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"></span>
<a name="l00003"></a>00003 <span class="comment"> Copyright 2006 MakingThings</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> Licensed under the Apache License, </span>
<a name="l00006"></a>00006 <span class="comment"> Version 2.0 (the "License"); you may not use this file except in compliance </span>
<a name="l00007"></a>00007 <span class="comment"> with the License. You may obtain a copy of the License at</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment"> http://www.apache.org/licenses/LICENSE-2.0 </span>
<a name="l00010"></a>00010 <span class="comment"> </span>
<a name="l00011"></a>00011 <span class="comment"> Unless required by applicable law or agreed to in writing, software distributed</span>
<a name="l00012"></a>00012 <span class="comment"> under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR</span>
<a name="l00013"></a>00013 <span class="comment"> CONDITIONS OF ANY KIND, either express or implied. See the License for</span>
<a name="l00014"></a>00014 <span class="comment"> the specific language governing permissions and limitations under the License.</span>
<a name="l00015"></a>00015 <span class="comment"></span>
<a name="l00016"></a>00016 <span class="comment">*********************************************************************************/</span>
<a name="l00017"></a>00017 
<a name="l00018"></a>00018 <span class="comment"></span>
<a name="l00019"></a>00019 <span class="comment">/** \file io.c  </span>
<a name="l00020"></a>00020 <span class="comment">  Subsystem for manipulating the general purpose IO lines.</span>
<a name="l00021"></a>00021 <span class="comment">*/</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="comment">/* Library includes */</span>
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 
<a name="l00026"></a>00026 <span class="comment">/* Scheduler includes */</span>
<a name="l00027"></a>00027 
<a name="l00028"></a>00028 <span class="comment">/* Hardware specific headers */</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "Board.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "AT91SAM7X256.h"</span>
<a name="l00031"></a>00031 
<a name="l00032"></a>00032 <span class="preprocessor">#include "io.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "config.h"</span>
<a name="l00034"></a>00034 
<a name="l00035"></a>00035 <span class="comment">/* Local Structures */</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="keyword">struct </span>IoPin_
<a name="l00038"></a>00038 {
<a name="l00039"></a>00039   uchar users : 7 ;
<a name="l00040"></a>00040   uchar lock : 1 ;
<a name="l00041"></a>00041 } __attribute__((packed));
<a name="l00042"></a>00042 
<a name="l00043"></a>00043 <span class="preprocessor">#define IO_PIN_COUNT 64</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define IO_USERS_MAX 127</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define IO_OUTPUT 1</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#define IO_INPUT 0</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span>
<a name="l00048"></a>00048 <span class="keyword">typedef</span> <span class="keyword">struct </span>IoPin_ IoPin ;
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 <span class="keyword">struct </span>Io_
<a name="l00051"></a>00051 {
<a name="l00052"></a>00052   <span class="keywordtype">int</span> users;
<a name="l00053"></a>00053   <span class="keywordtype">int</span> init; 
<a name="l00054"></a>00054   <span class="keywordtype">int</span> portAMask;
<a name="l00055"></a>00055   <span class="keywordtype">int</span> portBMask;
<a name="l00056"></a>00056   IoPin pins[ IO_PIN_COUNT ];
<a name="l00057"></a>00057 } Io;
<a name="l00058"></a>00058 
<a name="l00059"></a>00059 <span class="comment">// 260?</span>
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="keyword">static</span> <span class="keywordtype">void</span> Io_Init( <span class="keywordtype">void</span> );
<a name="l00062"></a>00062 <span class="keyword">static</span> <span class="keywordtype">void</span> Io_Deinit( <span class="keywordtype">void</span> );
<a name="l00063"></a>00063 
<a name="l00064"></a>00064 <span class="comment">/* Testing</span>
<a name="l00065"></a>00065 <span class="comment">static int Io_TestDataStructure( void );</span>
<a name="l00066"></a>00066 <span class="comment">static int Io_TestInitialState( void );</span>
<a name="l00067"></a>00067 <span class="comment">static int Io_TestStartStop( void );</span>
<a name="l00068"></a>00068 <span class="comment">static int Io_TestStartStopBits( void );</span>
<a name="l00069"></a>00069 <span class="comment">static int Io_TestPins( short users, bool lock );</span>
<a name="l00070"></a>00070 <span class="comment">*/</span>
<a name="l00071"></a>00071 <span class="comment"></span>
<a name="l00072"></a>00072 <span class="comment">/** \defgroup Io</span>
<a name="l00073"></a>00073 <span class="comment">  A mechanism to manage the 64 parallel IO lines on the controller.</span>
<a name="l00074"></a>00074 <span class="comment"></span>
<a name="l00075"></a>00075 <span class="comment">  Control of the SAM7X's IO lines is more complex than most microcontrollers.  All </span>
<a name="l00076"></a>00076 <span class="comment">  lines may be inputs or outputs, have pull-ups or not, have a glitch filter enabled </span>
<a name="l00077"></a>00077 <span class="comment">  or not, and so on.  In addition all IO pins serve at least double and sometimes </span>
<a name="l00078"></a>00078 <span class="comment">  triple duty, being general IO lines and also being IO lines for one or more of </span>
<a name="l00079"></a>00079 <span class="comment">  the controller's many on-chip peripherals.  All these functions can be controlled</span>
<a name="l00080"></a>00080 <span class="comment">  from the IO subsystem.</span>
<a name="l00081"></a>00081 <span class="comment"></span>
<a name="l00082"></a>00082 <span class="comment">  This API can be used in two ways - either one line at a time or many at a time.  </span>
<a name="l00083"></a>00083 <span class="comment">  Functions supporting the latter are suffixed with \b Bits.  So the one-at-a-time </span>
<a name="l00084"></a>00084 <span class="comment">  mechanism for setting an IO to true is called Io_SetTrue().  It takes an index and</span>
<a name="l00085"></a>00085 <span class="comment">  the ones for setting a number of lines is Io_SetTrueBits( ).</span>
<a name="l00086"></a>00086 <span class="comment"></span>
<a name="l00087"></a>00087 <span class="comment">  The pattern of use is as follows:  prior to using an IO line, Call Io_Start() on it, the </span>
<a name="l00088"></a>00088 <span class="comment">  return value indicates if the start operation was successful.  After this, call any </span>
<a name="l00089"></a>00089 <span class="comment">  of the other Io functions.</span>
<a name="l00090"></a>00090 <span class="comment"></span>
<a name="l00091"></a>00091 <span class="comment">  \todo Add glitch filter control</span>
<a name="l00092"></a>00092 <span class="comment">  \todo Implement more bits-style functions</span>
<a name="l00093"></a>00093 <span class="comment">  \ingroup Controller</span>
<a name="l00094"></a>00094 <span class="comment">  @{</span>
<a name="l00095"></a>00095 <span class="comment">*/</span>
<a name="l00096"></a>00096 
<a name="l00097"></a>00097 <span class="keywordtype">int</span> Io_Start( <span class="keywordtype">int</span> index, <span class="keywordtype">bool</span> lock )
<a name="l00098"></a>00098 {
<a name="l00099"></a>00099   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00100"></a>00100     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00101"></a>00101   IoPin* p = &amp;Io.pins[ index ];
<a name="l00102"></a>00102   <span class="comment">// If it's not locked at all and </span>
<a name="l00103"></a>00103   <span class="comment">//    either no lock is requested or no a lock is requested but no other are using the io and</span>
<a name="l00104"></a>00104   <span class="comment">//    there are not a huge number of users</span>
<a name="l00105"></a>00105   <span class="keywordflow">if</span> ( !p-&gt;lock &amp;&amp; ( !lock || ( lock &amp;&amp; p-&gt;users == 0 ) ) &amp;&amp; ( p-&gt;users &lt; IO_USERS_MAX - 2 ) )
<a name="l00106"></a>00106   {
<a name="l00107"></a>00107     <span class="keywordflow">if</span> ( Io.users == 0 )
<a name="l00108"></a>00108       Io_Init();
<a name="l00109"></a>00109    
<a name="l00110"></a>00110     <span class="comment">// Lock it up.</span>
<a name="l00111"></a>00111     Io.users++;
<a name="l00112"></a>00112     p-&gt;users++;
<a name="l00113"></a>00113     <span class="keywordflow">if</span> ( lock )
<a name="l00114"></a>00114       p-&gt;lock = <span class="keyword">true</span>;
<a name="l00115"></a>00115 
<a name="l00116"></a>00116     <span class="comment">// Output Pair 1</span>
<a name="l00117"></a>00117     <span class="comment">// Switch to PIO</span>
<a name="l00118"></a>00118     <span class="comment">// AT91C_BASE_PIOA-&gt;PIO_PER = AT91C_PIO_PA26;</span>
<a name="l00119"></a>00119     <span class="comment">// AT91C_BASE_PIOB-&gt;PIO_PER = AT91C_PIO_PB23;</span>
<a name="l00120"></a>00120     
<a name="l00121"></a>00121     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00122"></a>00122   }
<a name="l00123"></a>00123   <span class="keywordflow">else</span>
<a name="l00124"></a>00124     <span class="keywordflow">return</span> <a class="code" href="group___error.html#ga8ab27cd6609bc4484546458cb266fa3" title="There are too many other users on this resource.">CONTROLLER_ERROR_TOO_MANY_USERS</a>;
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126 
<a name="l00127"></a>00127 <span class="keywordtype">int</span> Io_Stop( <span class="keywordtype">int</span> index )
<a name="l00128"></a>00128 {
<a name="l00129"></a>00129   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00130"></a>00130     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00131"></a>00131   IoPin* p = &amp;Io.pins[ index ];
<a name="l00132"></a>00132   <span class="keywordflow">if</span> ( p-&gt;users &gt; 0 )
<a name="l00133"></a>00133   {
<a name="l00134"></a>00134     Io.users--;
<a name="l00135"></a>00135     p-&gt;users--;
<a name="l00136"></a>00136     p-&gt;lock = <span class="keyword">false</span>;
<a name="l00137"></a>00137 
<a name="l00138"></a>00138     <span class="keywordflow">if</span> ( Io.users == 0 )
<a name="l00139"></a>00139       Io_Deinit();
<a name="l00140"></a>00140 
<a name="l00141"></a>00141     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00142"></a>00142   }
<a name="l00143"></a>00143   <span class="keywordflow">else</span>
<a name="l00144"></a>00144     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gbe5b0c7c2a59668cdeb433375f091c2a" title="This resource has already been stopped too many times.">CONTROLLER_ERROR_TOO_MANY_STOPS</a>;
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 
<a name="l00147"></a>00147 <span class="keywordtype">int</span> Io_StartBits( longlong bits, <span class="keywordtype">bool</span> lock )
<a name="l00148"></a>00148 {
<a name="l00149"></a>00149   IoPin* p = &amp;Io.pins[ 0 ];
<a name="l00150"></a>00150   <span class="keywordtype">int</span> i = 0;
<a name="l00151"></a>00151   <span class="keywordtype">int</span> failure = -1;
<a name="l00152"></a>00152   ullong mask = 1LL;
<a name="l00153"></a>00153   <span class="keywordflow">for</span> ( i = 0; i &lt; 64; i++ )
<a name="l00154"></a>00154   {
<a name="l00155"></a>00155     <span class="keywordflow">if</span> ( bits &amp; mask )
<a name="l00156"></a>00156     {
<a name="l00157"></a>00157       <span class="keywordflow">if</span> ( !p-&gt;lock &amp;&amp; ( !lock || ( lock &amp;&amp; p-&gt;users == 0 ) ) &amp;&amp; p-&gt;users &lt; IO_USERS_MAX - 2 )
<a name="l00158"></a>00158       {
<a name="l00159"></a>00159         <span class="keywordflow">if</span> ( Io.users == 0 )
<a name="l00160"></a>00160           Io_Init();
<a name="l00161"></a>00161         <span class="keywordflow">if</span> ( lock )
<a name="l00162"></a>00162           p-&gt;lock = <span class="keyword">true</span>;
<a name="l00163"></a>00163         p-&gt;users++;
<a name="l00164"></a>00164         Io.users++;
<a name="l00165"></a>00165       }
<a name="l00166"></a>00166       <span class="keywordflow">else</span>
<a name="l00167"></a>00167       {
<a name="l00168"></a>00168         failure = i;
<a name="l00169"></a>00169         <span class="keywordflow">break</span>;
<a name="l00170"></a>00170       }
<a name="l00171"></a>00171     }
<a name="l00172"></a>00172     mask &lt;&lt;= 1;
<a name="l00173"></a>00173     p++;
<a name="l00174"></a>00174   }
<a name="l00175"></a>00175 
<a name="l00176"></a>00176   <span class="keywordflow">if</span> ( failure != -1 )
<a name="l00177"></a>00177   {
<a name="l00178"></a>00178     IoPin* p = &amp;Io.pins[ 0 ];
<a name="l00179"></a>00179     mask = 1LL;
<a name="l00180"></a>00180     <span class="keywordflow">for</span> ( i = 0; i &lt; failure; i++ )
<a name="l00181"></a>00181     {
<a name="l00182"></a>00182       <span class="keywordflow">if</span> ( bits &amp; mask )
<a name="l00183"></a>00183       {
<a name="l00184"></a>00184         <span class="keywordflow">if</span> ( lock )
<a name="l00185"></a>00185           p-&gt;lock = <span class="keyword">false</span>;
<a name="l00186"></a>00186         p-&gt;users--;
<a name="l00187"></a>00187         Io.users--;
<a name="l00188"></a>00188         <span class="keywordflow">if</span> ( Io.users == 0 )
<a name="l00189"></a>00189           Io_Deinit();
<a name="l00190"></a>00190       }
<a name="l00191"></a>00191       mask &lt;&lt;= 1;
<a name="l00192"></a>00192       p++;
<a name="l00193"></a>00193     }
<a name="l00194"></a>00194     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g5317aab1608afa7507da0214aec0dbab" title="Can&amp;#39;t get a lock on a resource.">CONTROLLER_ERROR_CANT_LOCK</a>;
<a name="l00195"></a>00195   }
<a name="l00196"></a>00196 
<a name="l00197"></a>00197   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00198"></a>00198 }
<a name="l00199"></a>00199 
<a name="l00200"></a>00200 <span class="keywordtype">int</span>  Io_StopBits( longlong bits )
<a name="l00201"></a>00201 {
<a name="l00202"></a>00202   IoPin* p = &amp;Io.pins[ 0 ];
<a name="l00203"></a>00203   <span class="keywordtype">int</span> i = 0;
<a name="l00204"></a>00204   ullong mask = 1LL;
<a name="l00205"></a>00205   <span class="keywordflow">for</span> ( i = 0; i &lt; 64; i++ )
<a name="l00206"></a>00206   {
<a name="l00207"></a>00207     <span class="keywordflow">if</span> ( bits &amp; mask )
<a name="l00208"></a>00208     {
<a name="l00209"></a>00209         p-&gt;lock = <span class="keyword">false</span>;
<a name="l00210"></a>00210         p-&gt;users--;
<a name="l00211"></a>00211         Io.users--;
<a name="l00212"></a>00212 
<a name="l00213"></a>00213         <span class="keywordflow">if</span> ( Io.users == 0 )
<a name="l00214"></a>00214           Io_Deinit();
<a name="l00215"></a>00215     }
<a name="l00216"></a>00216     mask &lt;&lt;= 1;
<a name="l00217"></a>00217     p++;
<a name="l00218"></a>00218   }
<a name="l00219"></a>00219   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00220"></a>00220 }
<a name="l00221"></a>00221 <span class="comment"></span>
<a name="l00222"></a>00222 <span class="comment">/**</span>
<a name="l00223"></a>00223 <span class="comment">  Lock or release an IO line.</span>
<a name="l00224"></a>00224 <span class="comment">  When you set an IO line active, you're locking it so it can't be used by anything else.</span>
<a name="l00225"></a>00225 <span class="comment">  When you're done with it, you should always set it to inactive so it can be used by</span>
<a name="l00226"></a>00226 <span class="comment">  other things if needed.</span>
<a name="l00227"></a>00227 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00228"></a>00228 <span class="comment">  @param value Specify \b true to set it active, or \b false to set it to inactive.</span>
<a name="l00229"></a>00229 <span class="comment">  </span>
<a name="l00230"></a>00230 <span class="comment">  \par Example</span>
<a name="l00231"></a>00231 <span class="comment">  \code</span>
<a name="l00232"></a>00232 <span class="comment">  // we want to use IO 18</span>
<a name="l00233"></a>00233 <span class="comment">  if( Io_SetActive( IO_PA18, true ) == CONTROLLER_OK )</span>
<a name="l00234"></a>00234 <span class="comment">  {</span>
<a name="l00235"></a>00235 <span class="comment">    DoThingsWithIO18( );</span>
<a name="l00236"></a>00236 <span class="comment">    // now we're done - unlock it</span>
<a name="l00237"></a>00237 <span class="comment">    Io_SetActive( IO_PA18, false );</span>
<a name="l00238"></a>00238 <span class="comment">  }</span>
<a name="l00239"></a>00239 <span class="comment">  \endcode</span>
<a name="l00240"></a>00240 <span class="comment">*/</span>
<a name="l00241"></a><a class="code" href="group___io.html#g8a4becb6f3eeeb93849fa352633d40f2">00241</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#g8a4becb6f3eeeb93849fa352633d40f2" title="Lock or release an IO line.">Io_SetActive</a>( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> value )
<a name="l00242"></a>00242 {
<a name="l00243"></a>00243   <span class="keywordflow">if</span> ( value )
<a name="l00244"></a>00244     <span class="keywordflow">return</span> Io_Start( index, <span class="keyword">false</span> );
<a name="l00245"></a>00245   <span class="keywordflow">else</span>
<a name="l00246"></a>00246     <span class="keywordflow">return</span> Io_Stop( index );
<a name="l00247"></a>00247   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00248"></a>00248 }
<a name="l00249"></a>00249 
<a name="l00250"></a>00250 <span class="keywordtype">int</span> Io_GetActive( <span class="keywordtype">int</span> index )
<a name="l00251"></a>00251 {
<a name="l00252"></a>00252   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00253"></a>00253     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00254"></a>00254   IoPin* p = &amp;Io.pins[ index ];
<a name="l00255"></a>00255   <span class="keywordflow">return</span> p-&gt;users &gt; 0;
<a name="l00256"></a>00256 }
<a name="l00257"></a>00257 <span class="comment"></span>
<a name="l00258"></a>00258 <span class="comment">/**</span>
<a name="l00259"></a>00259 <span class="comment">  Set whether an IO line is an output or an input.</span>
<a name="l00260"></a>00260 <span class="comment">  Use the IO_INPUT and IO_OUTPUT symbols to avoid confusion.</span>
<a name="l00261"></a>00261 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00262"></a>00262 <span class="comment">  @param output Specify 1 for an output, or 0 for an input.</span>
<a name="l00263"></a>00263 <span class="comment">  @return CONTROLLER_OK (0) on success, non-zero otherwise.</span>
<a name="l00264"></a>00264 <span class="comment">  </span>
<a name="l00265"></a>00265 <span class="comment">  \par Example</span>
<a name="l00266"></a>00266 <span class="comment">  \code</span>
<a name="l00267"></a>00267 <span class="comment">  // Set io23 to an input</span>
<a name="l00268"></a>00268 <span class="comment">  if( Io_SetDirection( IO_PA23, IO_INPUT ) == CONTROLLER_OK )</span>
<a name="l00269"></a>00269 <span class="comment">  {</span>
<a name="l00270"></a>00270 <span class="comment">    // success</span>
<a name="l00271"></a>00271 <span class="comment">  }</span>
<a name="l00272"></a>00272 <span class="comment">  \endcode</span>
<a name="l00273"></a>00273 <span class="comment">*/</span>
<a name="l00274"></a><a class="code" href="group___io.html#gf836954ad8c7001e80d3c043a3c23a75">00274</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#gf836954ad8c7001e80d3c043a3c23a75" title="Set whether an IO line is an output or an input.">Io_SetDirection</a>( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> output )
<a name="l00275"></a>00275 {
<a name="l00276"></a>00276   <span class="keywordflow">if</span> ( output )
<a name="l00277"></a>00277     <span class="keywordflow">return</span> Io_SetOutput( index );
<a name="l00278"></a>00278   <span class="keywordflow">else</span>
<a name="l00279"></a>00279     <span class="keywordflow">return</span> Io_SetInput( index );
<a name="l00280"></a>00280 }
<a name="l00281"></a>00281 <span class="comment"></span>
<a name="l00282"></a>00282 <span class="comment">/**</span>
<a name="l00283"></a>00283 <span class="comment">  Read whether an IO line is an output or an input.</span>
<a name="l00284"></a>00284 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00285"></a>00285 <span class="comment">  @return Non-zero if the pin is an output, 0 if it's an input.</span>
<a name="l00286"></a>00286 <span class="comment">  </span>
<a name="l00287"></a>00287 <span class="comment">  \par Example</span>
<a name="l00288"></a>00288 <span class="comment">  \code</span>
<a name="l00289"></a>00289 <span class="comment">  // Check whether IO 23 is an output or input</span>
<a name="l00290"></a>00290 <span class="comment">  if( Io_GetDirection( IO_PA23 ) )</span>
<a name="l00291"></a>00291 <span class="comment">  {</span>
<a name="l00292"></a>00292 <span class="comment">    // then we're an output</span>
<a name="l00293"></a>00293 <span class="comment">  }</span>
<a name="l00294"></a>00294 <span class="comment">  else</span>
<a name="l00295"></a>00295 <span class="comment">  {</span>
<a name="l00296"></a>00296 <span class="comment">    // we're an input</span>
<a name="l00297"></a>00297 <span class="comment">  }</span>
<a name="l00298"></a>00298 <span class="comment">  \endcode</span>
<a name="l00299"></a>00299 <span class="comment">*/</span>
<a name="l00300"></a><a class="code" href="group___io.html#g068a4b07b47f9c71d39d1f88ed50ba64">00300</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#g068a4b07b47f9c71d39d1f88ed50ba64" title="Read whether an IO line is an output or an input.">Io_GetDirection</a>( <span class="keywordtype">int</span> index )
<a name="l00301"></a>00301 {
<a name="l00302"></a>00302   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00303"></a>00303     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00304"></a>00304 
<a name="l00305"></a>00305   <span class="keywordflow">if</span> ( index &lt; 32 ) 
<a name="l00306"></a>00306     <span class="keywordflow">return</span> ( AT91C_BASE_PIOA-&gt;PIO_OSR &amp; ( 1 &lt;&lt; index ) ) != 0;
<a name="l00307"></a>00307   <span class="keywordflow">else</span>
<a name="l00308"></a>00308     <span class="keywordflow">return</span> ( AT91C_BASE_PIOB-&gt;PIO_OSR &amp; ( 1 &lt;&lt; ( index &amp; 0x1F ) ) ) != 0;
<a name="l00309"></a>00309 }
<a name="l00310"></a>00310 
<a name="l00311"></a>00311 <span class="keywordtype">int</span> Io_SetOutput( <span class="keywordtype">int</span> index )
<a name="l00312"></a>00312 {
<a name="l00313"></a>00313   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00314"></a>00314     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00315"></a>00315 
<a name="l00316"></a>00316   <span class="comment">// Switch to outputs</span>
<a name="l00317"></a>00317   <span class="keywordflow">if</span> ( index &lt; 32 ) 
<a name="l00318"></a>00318     AT91C_BASE_PIOA-&gt;PIO_OER = 1 &lt;&lt; index;
<a name="l00319"></a>00319   <span class="keywordflow">else</span>
<a name="l00320"></a>00320     AT91C_BASE_PIOB-&gt;PIO_OER = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00321"></a>00321 
<a name="l00322"></a>00322   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00323"></a>00323 }
<a name="l00324"></a>00324 
<a name="l00325"></a>00325 <span class="keywordtype">int</span> Io_SetInput( <span class="keywordtype">int</span> index )
<a name="l00326"></a>00326 {
<a name="l00327"></a>00327   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00328"></a>00328     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00329"></a>00329 
<a name="l00330"></a>00330   <span class="comment">// Switch to inputs</span>
<a name="l00331"></a>00331   <span class="keywordflow">if</span> ( index &lt; 32 ) 
<a name="l00332"></a>00332     AT91C_BASE_PIOA-&gt;PIO_ODR = 1 &lt;&lt; index;
<a name="l00333"></a>00333   <span class="keywordflow">else</span>
<a name="l00334"></a>00334     AT91C_BASE_PIOB-&gt;PIO_ODR = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00335"></a>00335 
<a name="l00336"></a>00336   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00337"></a>00337 }
<a name="l00338"></a>00338 
<a name="l00339"></a>00339 
<a name="l00340"></a>00340 <span class="keywordtype">int</span> Io_SetTrue( <span class="keywordtype">int</span> index )
<a name="l00341"></a>00341 {
<a name="l00342"></a>00342   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00343"></a>00343     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00344"></a>00344 
<a name="l00345"></a>00345   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00346"></a>00346   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00347"></a>00347       AT91C_BASE_PIOA-&gt;PIO_SODR = mask;
<a name="l00348"></a>00348   <span class="keywordflow">else</span>
<a name="l00349"></a>00349       AT91C_BASE_PIOB-&gt;PIO_SODR = mask;
<a name="l00350"></a>00350   
<a name="l00351"></a>00351   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00352"></a>00352 }
<a name="l00353"></a>00353 
<a name="l00354"></a>00354 
<a name="l00355"></a>00355 <span class="keywordtype">int</span> Io_SetFalse( <span class="keywordtype">int</span> index )
<a name="l00356"></a>00356 {
<a name="l00357"></a>00357   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00358"></a>00358     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00359"></a>00359 
<a name="l00360"></a>00360   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00361"></a>00361   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00362"></a>00362       AT91C_BASE_PIOA-&gt;PIO_CODR = mask;
<a name="l00363"></a>00363   <span class="keywordflow">else</span>
<a name="l00364"></a>00364       AT91C_BASE_PIOB-&gt;PIO_CODR = mask;
<a name="l00365"></a>00365   
<a name="l00366"></a>00366   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00367"></a>00367 }
<a name="l00368"></a>00368 <span class="comment"></span>
<a name="l00369"></a>00369 <span class="comment"> /**</span>
<a name="l00370"></a>00370 <span class="comment">  Turn an IO line on or off.</span>
<a name="l00371"></a>00371 <span class="comment">  This IO should have already been set to be an output via Io_SetDirection( )</span>
<a name="l00372"></a>00372 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00373"></a>00373 <span class="comment">  @param value Non-zero for on, 0 for off.</span>
<a name="l00374"></a>00374 <span class="comment">  @return CONTROLLER_OK (0) on success, otherwise non-zero.</span>
<a name="l00375"></a>00375 <span class="comment">  </span>
<a name="l00376"></a>00376 <span class="comment">  \par Example</span>
<a name="l00377"></a>00377 <span class="comment">  \code</span>
<a name="l00378"></a>00378 <span class="comment">  // Turn on IO 17</span>
<a name="l00379"></a>00379 <span class="comment">  Io_SetValue( IO_PA17, 1 );</span>
<a name="l00380"></a>00380 <span class="comment">  \endcode</span>
<a name="l00381"></a>00381 <span class="comment">*/</span>
<a name="l00382"></a><a class="code" href="group___io.html#g31c976a85de4306c66be6b4c441d3892">00382</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#g31c976a85de4306c66be6b4c441d3892" title="Turn an IO line on or off.">Io_SetValue</a>( <span class="keywordtype">int</span> index, <span class="keywordtype">char</span> value )
<a name="l00383"></a>00383 {
<a name="l00384"></a>00384   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00385"></a>00385     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00386"></a>00386 
<a name="l00387"></a>00387   <span class="comment">// Switch to outputs</span>
<a name="l00388"></a>00388   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00389"></a>00389   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00390"></a>00390   {
<a name="l00391"></a>00391     <span class="keywordflow">if</span> ( value )
<a name="l00392"></a>00392       AT91C_BASE_PIOA-&gt;PIO_SODR = mask;
<a name="l00393"></a>00393     <span class="keywordflow">else</span>
<a name="l00394"></a>00394       AT91C_BASE_PIOA-&gt;PIO_CODR = mask;
<a name="l00395"></a>00395   }
<a name="l00396"></a>00396   <span class="keywordflow">else</span>
<a name="l00397"></a>00397   {
<a name="l00398"></a>00398     <span class="keywordflow">if</span> ( value )
<a name="l00399"></a>00399       AT91C_BASE_PIOB-&gt;PIO_SODR = mask;
<a name="l00400"></a>00400     <span class="keywordflow">else</span>
<a name="l00401"></a>00401       AT91C_BASE_PIOB-&gt;PIO_CODR = mask;
<a name="l00402"></a>00402   }
<a name="l00403"></a>00403   
<a name="l00404"></a>00404   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00405"></a>00405 }
<a name="l00406"></a>00406 <span class="comment"></span>
<a name="l00407"></a>00407 <span class="comment"> /**</span>
<a name="l00408"></a>00408 <span class="comment">  Read whether an IO line, presumably set as an output, is on or off.</span>
<a name="l00409"></a>00409 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00410"></a>00410 <span class="comment">  @return CONTROLLER_OK (0) on success, otherwise non-zero.</span>
<a name="l00411"></a>00411 <span class="comment">  </span>
<a name="l00412"></a>00412 <span class="comment">  \par Example</span>
<a name="l00413"></a>00413 <span class="comment">  \code</span>
<a name="l00414"></a>00414 <span class="comment">  // Turn on IO 17</span>
<a name="l00415"></a>00415 <span class="comment">  Io_SetValue( IO_PA17, 1 );</span>
<a name="l00416"></a>00416 <span class="comment">  \endcode</span>
<a name="l00417"></a>00417 <span class="comment">*/</span>
<a name="l00418"></a><a class="code" href="group___io.html#gfdcf7332d0ae5b38d2a776fb6cc5ba7b">00418</a> <span class="keywordtype">char</span> <a class="code" href="group___io.html#gfdcf7332d0ae5b38d2a776fb6cc5ba7b" title="Read whether an IO line, presumably set as an output, is on or off.">Io_GetValue</a>( <span class="keywordtype">int</span> index )
<a name="l00419"></a>00419 {
<a name="l00420"></a>00420   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00421"></a>00421     <span class="keywordflow">return</span> 0;
<a name="l00422"></a>00422   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00423"></a>00423   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00424"></a>00424     <span class="keywordflow">return</span> ( ( AT91C_BASE_PIOA-&gt;PIO_PDSR &amp; mask ) != 0 ) ? 1 : 0;
<a name="l00425"></a>00425   <span class="keywordflow">else</span>
<a name="l00426"></a>00426     <span class="keywordflow">return</span> ( ( AT91C_BASE_PIOB-&gt;PIO_PDSR &amp; mask ) != 0 ) ? 1 : 0;
<a name="l00427"></a>00427 }
<a name="l00428"></a>00428 
<a name="l00429"></a>00429 <span class="keywordtype">int</span>  Io_SetPeripheralA( <span class="keywordtype">int</span> index )
<a name="l00430"></a>00430 {
<a name="l00431"></a>00431   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00432"></a>00432     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00433"></a>00433 
<a name="l00434"></a>00434   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00435"></a>00435   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00436"></a>00436       AT91C_BASE_PIOA-&gt;PIO_ASR = mask;
<a name="l00437"></a>00437   <span class="keywordflow">else</span>
<a name="l00438"></a>00438       AT91C_BASE_PIOB-&gt;PIO_ASR = mask;
<a name="l00439"></a>00439   
<a name="l00440"></a>00440   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00441"></a>00441 }
<a name="l00442"></a>00442 
<a name="l00443"></a>00443 <span class="keywordtype">int</span>  Io_SetPeripheralB( <span class="keywordtype">int</span> index )
<a name="l00444"></a>00444 {
<a name="l00445"></a>00445   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00446"></a>00446     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00447"></a>00447 
<a name="l00448"></a>00448   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00449"></a>00449   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00450"></a>00450       AT91C_BASE_PIOA-&gt;PIO_BSR = mask;
<a name="l00451"></a>00451   <span class="keywordflow">else</span>
<a name="l00452"></a>00452       AT91C_BASE_PIOB-&gt;PIO_BSR = mask;
<a name="l00453"></a>00453   
<a name="l00454"></a>00454   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00455"></a>00455 }
<a name="l00456"></a>00456 
<a name="l00457"></a>00457 
<a name="l00458"></a>00458 <span class="keywordtype">int</span> Io_SetPio( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> enable )
<a name="l00459"></a>00459 {
<a name="l00460"></a>00460   <span class="keywordflow">if</span> ( enable )
<a name="l00461"></a>00461     <span class="keywordflow">return</span> Io_PioEnable( index );
<a name="l00462"></a>00462   <span class="keywordflow">else</span>
<a name="l00463"></a>00463     <span class="keywordflow">return</span> Io_PioDisable( index );
<a name="l00464"></a>00464 }
<a name="l00465"></a>00465 
<a name="l00466"></a>00466 <span class="keywordtype">int</span> Io_GetPio( <span class="keywordtype">int</span> index )
<a name="l00467"></a>00467 {
<a name="l00468"></a>00468   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00469"></a>00469     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00470"></a>00470 
<a name="l00471"></a>00471   <span class="keywordflow">if</span> ( index &lt; 32 ) 
<a name="l00472"></a>00472     <span class="keywordflow">return</span> ( AT91C_BASE_PIOA-&gt;PIO_PSR &amp; ( 1 &lt;&lt; index ) ) != 0;
<a name="l00473"></a>00473   <span class="keywordflow">else</span>
<a name="l00474"></a>00474     <span class="keywordflow">return</span> ( AT91C_BASE_PIOB-&gt;PIO_PSR &amp; ( 1 &lt;&lt; ( index &amp; 0x1F ) ) ) != 0;
<a name="l00475"></a>00475 }
<a name="l00476"></a>00476 
<a name="l00477"></a>00477 <span class="keywordtype">int</span>  Io_PioEnable( <span class="keywordtype">int</span> index )
<a name="l00478"></a>00478 {
<a name="l00479"></a>00479   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00480"></a>00480     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00481"></a>00481 
<a name="l00482"></a>00482   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00483"></a>00483   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00484"></a>00484       AT91C_BASE_PIOA-&gt;PIO_PER = mask;
<a name="l00485"></a>00485   <span class="keywordflow">else</span>
<a name="l00486"></a>00486       AT91C_BASE_PIOB-&gt;PIO_PER = mask;
<a name="l00487"></a>00487   
<a name="l00488"></a>00488   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00489"></a>00489 }
<a name="l00490"></a>00490 
<a name="l00491"></a>00491 <span class="keywordtype">int</span>  Io_PioDisable( <span class="keywordtype">int</span> index )
<a name="l00492"></a>00492 {  
<a name="l00493"></a>00493   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00494"></a>00494     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00495"></a>00495 
<a name="l00496"></a>00496   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00497"></a>00497   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00498"></a>00498       AT91C_BASE_PIOA-&gt;PIO_PDR = mask;
<a name="l00499"></a>00499   <span class="keywordflow">else</span>
<a name="l00500"></a>00500       AT91C_BASE_PIOB-&gt;PIO_PDR = mask;
<a name="l00501"></a>00501   
<a name="l00502"></a>00502   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00503"></a>00503 }
<a name="l00504"></a>00504 <span class="comment"></span>
<a name="l00505"></a>00505 <span class="comment"> /**</span>
<a name="l00506"></a>00506 <span class="comment">  Set the pullup resistor for an IO line on or off.</span>
<a name="l00507"></a>00507 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00508"></a>00508 <span class="comment">  @param enable Non-zero for on, 0 for off.</span>
<a name="l00509"></a>00509 <span class="comment">  @return CONTROLLER_OK (0) on success, otherwise non-zero.</span>
<a name="l00510"></a>00510 <span class="comment">  </span>
<a name="l00511"></a>00511 <span class="comment">  \par Example</span>
<a name="l00512"></a>00512 <span class="comment">  \code</span>
<a name="l00513"></a>00513 <span class="comment">  // Turn on the pullup for IO 17</span>
<a name="l00514"></a>00514 <span class="comment">  Io_SetPullup( IO_PA17, 1 );</span>
<a name="l00515"></a>00515 <span class="comment">  \endcode</span>
<a name="l00516"></a>00516 <span class="comment">*/</span>
<a name="l00517"></a><a class="code" href="group___io.html#g3ff4308d5768d83b4f2fe153576fc21e">00517</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#g3ff4308d5768d83b4f2fe153576fc21e" title="Set the pullup resistor for an IO line on or off.">Io_SetPullup</a>( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> enable )
<a name="l00518"></a>00518 {
<a name="l00519"></a>00519   <span class="keywordflow">if</span> ( enable )
<a name="l00520"></a>00520     <span class="keywordflow">return</span> Io_PullupEnable( index );
<a name="l00521"></a>00521   <span class="keywordflow">else</span>
<a name="l00522"></a>00522     <span class="keywordflow">return</span> Io_PullupDisable( index );
<a name="l00523"></a>00523 }
<a name="l00524"></a>00524 <span class="comment"></span>
<a name="l00525"></a>00525 <span class="comment"> /**</span>
<a name="l00526"></a>00526 <span class="comment">  Read whether the pullup resistor for an IO line on or off.</span>
<a name="l00527"></a>00527 <span class="comment">  @param index An int specifying which IO line.  Use the appropriate entry from the \ref IoIndices</span>
<a name="l00528"></a>00528 <span class="comment">  @return CONTROLLER_OK (0) on success, otherwise non-zero.</span>
<a name="l00529"></a>00529 <span class="comment">  </span>
<a name="l00530"></a>00530 <span class="comment">  \par Example</span>
<a name="l00531"></a>00531 <span class="comment">  \code</span>
<a name="l00532"></a>00532 <span class="comment">  // Turn on the pullup for IO 17</span>
<a name="l00533"></a>00533 <span class="comment">  Io_GetPullup( IO_PA17 );</span>
<a name="l00534"></a>00534 <span class="comment">  \endcode</span>
<a name="l00535"></a>00535 <span class="comment">*/</span>
<a name="l00536"></a><a class="code" href="group___io.html#gea14ac73a96c7c5ede5313532fcd35d7">00536</a> <span class="keywordtype">int</span> <a class="code" href="group___io.html#gea14ac73a96c7c5ede5313532fcd35d7" title="Read whether the pullup resistor for an IO line on or off.">Io_GetPullup</a>( <span class="keywordtype">int</span> index )
<a name="l00537"></a>00537 {
<a name="l00538"></a>00538   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00539"></a>00539     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00540"></a>00540 
<a name="l00541"></a>00541   <span class="comment">// The PullUp status register is inverted.</span>
<a name="l00542"></a>00542   <span class="keywordflow">if</span> ( index &lt; 32 ) 
<a name="l00543"></a>00543     <span class="keywordflow">return</span> ( AT91C_BASE_PIOA-&gt;PIO_PPUSR &amp; ( 1 &lt;&lt; index ) ) == 0;
<a name="l00544"></a>00544   <span class="keywordflow">else</span>
<a name="l00545"></a>00545     <span class="keywordflow">return</span> ( AT91C_BASE_PIOB-&gt;PIO_PPUSR &amp; ( 1 &lt;&lt; ( index &amp; 0x1F ) ) ) == 0;
<a name="l00546"></a>00546 }
<a name="l00547"></a>00547 
<a name="l00548"></a>00548 <span class="keywordtype">int</span>  Io_PullupEnable( <span class="keywordtype">int</span> index )
<a name="l00549"></a>00549 {
<a name="l00550"></a>00550   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00551"></a>00551     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00552"></a>00552 
<a name="l00553"></a>00553   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00554"></a>00554   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00555"></a>00555       AT91C_BASE_PIOA-&gt;PIO_PPUER = mask;
<a name="l00556"></a>00556   <span class="keywordflow">else</span>
<a name="l00557"></a>00557       AT91C_BASE_PIOB-&gt;PIO_PPUER = mask;
<a name="l00558"></a>00558   
<a name="l00559"></a>00559   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00560"></a>00560 }
<a name="l00561"></a>00561 
<a name="l00562"></a>00562 <span class="keywordtype">int</span>  Io_PullupDisable( <span class="keywordtype">int</span> index )
<a name="l00563"></a>00563 {  
<a name="l00564"></a>00564   <span class="keywordflow">if</span> ( index &lt; 0 || index &gt; IO_PIN_COUNT )
<a name="l00565"></a>00565     <span class="keywordflow">return</span> <a class="code" href="group___error.html#g097f40c958abccd892d08f31b53c4dde" title="The requested index is not valid.">CONTROLLER_ERROR_ILLEGAL_INDEX</a>;
<a name="l00566"></a>00566 
<a name="l00567"></a>00567   <span class="keywordtype">int</span> mask = 1 &lt;&lt; ( index &amp; 0x1F );
<a name="l00568"></a>00568   <span class="keywordflow">if</span> ( index &lt; 32 )
<a name="l00569"></a>00569       AT91C_BASE_PIOA-&gt;PIO_PPUDR = mask;
<a name="l00570"></a>00570   <span class="keywordflow">else</span>
<a name="l00571"></a>00571       AT91C_BASE_PIOB-&gt;PIO_PPUDR = mask;
<a name="l00572"></a>00572   
<a name="l00573"></a>00573   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00574"></a>00574 }
<a name="l00575"></a>00575 
<a name="l00576"></a>00576 <span class="keywordtype">void</span> Io_SetTrueBits( longlong bits )
<a name="l00577"></a>00577 {
<a name="l00578"></a>00578   AT91C_BASE_PIOA-&gt;PIO_SODR = bits &gt;&gt; 32; 
<a name="l00579"></a>00579   AT91C_BASE_PIOB-&gt;PIO_SODR = bits &amp; 0xFFFFFFFF;
<a name="l00580"></a>00580 }
<a name="l00581"></a>00581 
<a name="l00582"></a>00582 <span class="keywordtype">void</span> Io_SetFalseBits( longlong bits )
<a name="l00583"></a>00583 {
<a name="l00584"></a>00584   AT91C_BASE_PIOA-&gt;PIO_CODR = bits &gt;&gt; 32;
<a name="l00585"></a>00585   AT91C_BASE_PIOB-&gt;PIO_CODR = bits &amp; 0xFFFFFFFF;
<a name="l00586"></a>00586 }
<a name="l00587"></a>00587 
<a name="l00588"></a>00588 <span class="keywordtype">void</span> Io_SetValueBits( longlong bits, longlong values )
<a name="l00589"></a>00589 {
<a name="l00590"></a>00590   <span class="keywordtype">int</span> aBits = bits &gt;&gt; 32;
<a name="l00591"></a>00591   <span class="keywordtype">int</span> aValues = values &gt;&gt; 32;
<a name="l00592"></a>00592   <span class="keywordtype">int</span> bBits = bits &amp; 0xFFFFFFFF;
<a name="l00593"></a>00593   <span class="keywordtype">int</span> bValues = values &amp; 0xFFFFFFFF;
<a name="l00594"></a>00594   AT91C_BASE_PIOA-&gt;PIO_SODR = (int)( aBits &amp; aValues );
<a name="l00595"></a>00595   AT91C_BASE_PIOA-&gt;PIO_CODR = (int)( aBits &amp; ~aValues  );
<a name="l00596"></a>00596   AT91C_BASE_PIOB-&gt;PIO_SODR = (int)( bBits &amp; bValues );
<a name="l00597"></a>00597   AT91C_BASE_PIOB-&gt;PIO_CODR = (int)( bBits &amp; ~bValues  );
<a name="l00598"></a>00598 }
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 <span class="keywordtype">void</span> Io_SetOutputBits( longlong bits )
<a name="l00601"></a>00601 {
<a name="l00602"></a>00602   AT91C_BASE_PIOA-&gt;PIO_OER = bits &gt;&gt; 32;
<a name="l00603"></a>00603   AT91C_BASE_PIOB-&gt;PIO_OER = bits &amp; 0xFFFFFFFF;
<a name="l00604"></a>00604 }
<a name="l00605"></a>00605 
<a name="l00606"></a>00606 <span class="keywordtype">void</span> Io_SetInputBits( longlong bits )
<a name="l00607"></a>00607 {
<a name="l00608"></a>00608   AT91C_BASE_PIOA-&gt;PIO_ODR = bits &gt;&gt; 32;
<a name="l00609"></a>00609   AT91C_BASE_PIOB-&gt;PIO_ODR = bits &amp; 0xFFFFFFFF;
<a name="l00610"></a>00610 }
<a name="l00611"></a>00611 
<a name="l00612"></a>00612 <span class="keywordtype">int</span> Io_SetPortA( <span class="keywordtype">int</span> value )
<a name="l00613"></a>00613 {
<a name="l00614"></a>00614   AT91C_BASE_PIOA-&gt;PIO_SODR = (int)( Io.portAMask &amp; value );
<a name="l00615"></a>00615   AT91C_BASE_PIOA-&gt;PIO_CODR = (int)( Io.portAMask &amp; ~value  );
<a name="l00616"></a>00616   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00617"></a>00617 }
<a name="l00618"></a>00618 
<a name="l00619"></a>00619 <span class="keywordtype">int</span> Io_GetPortA( )
<a name="l00620"></a>00620 {
<a name="l00621"></a>00621   <span class="keywordflow">return</span> Io.portAMask &amp; AT91C_BASE_PIOA-&gt;PIO_PDSR;
<a name="l00622"></a>00622 }
<a name="l00623"></a>00623 
<a name="l00624"></a>00624 <span class="keywordtype">int</span> Io_SetPortB( <span class="keywordtype">int</span> value )
<a name="l00625"></a>00625 {
<a name="l00626"></a>00626   AT91C_BASE_PIOB-&gt;PIO_SODR = (int)( Io.portBMask &amp; value );
<a name="l00627"></a>00627   AT91C_BASE_PIOB-&gt;PIO_CODR = (int)( Io.portBMask &amp; ~value  );
<a name="l00628"></a>00628   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00629"></a>00629 }
<a name="l00630"></a>00630 
<a name="l00631"></a>00631 <span class="keywordtype">int</span> Io_GetPortB( )
<a name="l00632"></a>00632 {
<a name="l00633"></a>00633   <span class="keywordflow">return</span> Io.portBMask &amp; AT91C_BASE_PIOB-&gt;PIO_PDSR;
<a name="l00634"></a>00634 }
<a name="l00635"></a>00635 
<a name="l00636"></a>00636 <span class="keywordtype">int</span> Io_SetPortAMask( <span class="keywordtype">int</span> value )
<a name="l00637"></a>00637 {
<a name="l00638"></a>00638   Io.portAMask = value;
<a name="l00639"></a>00639   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00640"></a>00640 }
<a name="l00641"></a>00641 
<a name="l00642"></a>00642 <span class="keywordtype">int</span> Io_GetPortAMask( )
<a name="l00643"></a>00643 {
<a name="l00644"></a>00644   <span class="keywordflow">return</span> Io.portAMask;
<a name="l00645"></a>00645 }
<a name="l00646"></a>00646 
<a name="l00647"></a>00647 <span class="keywordtype">int</span> Io_SetPortBMask( <span class="keywordtype">int</span> value )
<a name="l00648"></a>00648 {
<a name="l00649"></a>00649   Io.portBMask = value;
<a name="l00650"></a>00650   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00651"></a>00651 }
<a name="l00652"></a>00652 
<a name="l00653"></a>00653 <span class="keywordtype">int</span> Io_GetPortBMask( )
<a name="l00654"></a>00654 {
<a name="l00655"></a>00655   <span class="keywordflow">return</span> Io.portBMask;
<a name="l00656"></a>00656 }
<a name="l00657"></a>00657 
<a name="l00658"></a>00658 <span class="keywordtype">void</span> Io_Init()
<a name="l00659"></a>00659 {
<a name="l00660"></a>00660   Io.init++;
<a name="l00661"></a>00661 
<a name="l00662"></a>00662     <span class="comment">/* Enable the peripheral clock. */</span>
<a name="l00663"></a>00663   AT91C_BASE_PMC-&gt;PMC_PCER = 1 &lt;&lt; AT91C_ID_PIOA;
<a name="l00664"></a>00664   AT91C_BASE_PMC-&gt;PMC_PCER = 1 &lt;&lt; AT91C_ID_PIOB;
<a name="l00665"></a>00665 
<a name="l00666"></a>00666   Io.portAMask = 0;
<a name="l00667"></a>00667   Io.portBMask = 0;
<a name="l00668"></a>00668 }
<a name="l00669"></a>00669 
<a name="l00670"></a>00670 <span class="keywordtype">void</span> Io_Deinit()
<a name="l00671"></a>00671 {
<a name="l00672"></a>00672   Io.init--;
<a name="l00673"></a>00673 }
<a name="l00674"></a>00674 
<a name="l00675"></a>00675 longlong Io_GetValueBits( )
<a name="l00676"></a>00676 {
<a name="l00677"></a>00677   <span class="keywordflow">return</span> ( ((longlong)AT91C_BASE_PIOA-&gt;PIO_PDSR) &lt;&lt; 32 ) || AT91C_BASE_PIOB-&gt;PIO_PDSR;
<a name="l00678"></a>00678 }
<a name="l00679"></a>00679 <span class="comment"></span>
<a name="l00680"></a>00680 <span class="comment">/** @}</span>
<a name="l00681"></a>00681 <span class="comment">*/</span>
<a name="l00682"></a>00682 
<a name="l00683"></a>00683 <span class="preprocessor">#ifdef OSC</span>
<a name="l00684"></a>00684 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00685"></a>00685 <span class="comment">/** \defgroup IoOSC IO - OSC</span>
<a name="l00686"></a>00686 <span class="comment">  Control any pin's direction and output from OSC.</span>
<a name="l00687"></a>00687 <span class="comment"></span>
<a name="l00688"></a>00688 <span class="comment">  The IO system allows for the manual manipulation of individual signal lines on the Make Controller.</span>
<a name="l00689"></a>00689 <span class="comment">  Proceed with care if you're using these at the same time as any of the other subsystems, as most </span>
<a name="l00690"></a>00690 <span class="comment">  other subsystems rely on the IO system internally to maintain control of the appropriate signal lines.</span>
<a name="l00691"></a>00691 <span class="comment">  \ingroup OSC</span>
<a name="l00692"></a>00692 <span class="comment">  </span>
<a name="l00693"></a>00693 <span class="comment">  \section devices Devices</span>
<a name="l00694"></a>00694 <span class="comment">  There are 64 IO's on the Make Controller, numbered 0 - 63.</span>
<a name="l00695"></a>00695 <span class="comment">  - IOs &lt;b&gt;0 - 31&lt;/b&gt; correspond to \b PortA</span>
<a name="l00696"></a>00696 <span class="comment">  - IOs &lt;b&gt;32 - 63 &lt;/b&gt; correspond to \b PortB.</span>
<a name="l00697"></a>00697 <span class="comment">  </span>
<a name="l00698"></a>00698 <span class="comment">  \section properties Properties</span>
<a name="l00699"></a>00699 <span class="comment">  Each IO has four properties:</span>
<a name="l00700"></a>00700 <span class="comment">  - output</span>
<a name="l00701"></a>00701 <span class="comment">  - value</span>
<a name="l00702"></a>00702 <span class="comment">  - pullup</span>
<a name="l00703"></a>00703 <span class="comment">  - active</span>
<a name="l00704"></a>00704 <span class="comment"></span>
<a name="l00705"></a>00705 <span class="comment">  \par Output</span>
<a name="l00706"></a>00706 <span class="comment">  The \b output property sets whether the IO is an output.</span>
<a name="l00707"></a>00707 <span class="comment">  A value of \b 1 makes it an output, and a value of \b 0 makes it an input.</span>
<a name="l00708"></a>00708 <span class="comment">  For example, to make pin 4 an output, send a message like</span>
<a name="l00709"></a>00709 <span class="comment">  \verbatim /io/4/output 1\endverbatim</span>
<a name="l00710"></a>00710 <span class="comment">  Send the message</span>
<a name="l00711"></a>00711 <span class="comment">  \verbatim /io/4/output 0\endverbatim</span>
<a name="l00712"></a>00712 <span class="comment">  to make it an input.</span>
<a name="l00713"></a>00713 <span class="comment"></span>
<a name="l00714"></a>00714 <span class="comment">  \par Pullup</span>
<a name="l00715"></a>00715 <span class="comment">  The \b pullup property determines whether a given IOs pullup resistor is enabled.</span>
<a name="l00716"></a>00716 <span class="comment">  To enable it on IO 2, send the message</span>
<a name="l00717"></a>00717 <span class="comment">  \verbatim /io/2/pullup 1\endverbatim</span>
<a name="l00718"></a>00718 <span class="comment">  and to disable it, send the message</span>
<a name="l00719"></a>00719 <span class="comment">  \verbatim /io/2/pullup 0\endverbatim</span>
<a name="l00720"></a>00720 <span class="comment"></span>
<a name="l00721"></a>00721 <span class="comment">  \par Value</span>
<a name="l00722"></a>00722 <span class="comment">  Writing the \b value property sets the on/off value of a given IO.</span>
<a name="l00723"></a>00723 <span class="comment">  The IO system only permits digital IO so, we only want to send ones and zeros as values.</span>
<a name="l00724"></a>00724 <span class="comment">  For example, to activate pin 4, send a message like</span>
<a name="l00725"></a>00725 <span class="comment">  \verbatim /io/4/value 1\endverbatim</span>
<a name="l00726"></a>00726 <span class="comment">  Change the argument 1 to a 0 to turn it off.</span>
<a name="l00727"></a>00727 <span class="comment">  Reading the \b value property returns the value of a given IO.</span>
<a name="l00728"></a>00728 <span class="comment">  For example, to read pin 4, send a message like</span>
<a name="l00729"></a>00729 <span class="comment">  \verbatim /io/4/value\endverbatim</span>
<a name="l00730"></a>00730 <span class="comment">    </span>
<a name="l00731"></a>00731 <span class="comment">  \par Active</span>
<a name="l00732"></a>00732 <span class="comment">  The \b active property corresponds to the active state of an IO.</span>
<a name="l00733"></a>00733 <span class="comment">  Read whether IO 0 is active by sending the message</span>
<a name="l00734"></a>00734 <span class="comment">  \verbatim /io/0/active \endverbatim</span>
<a name="l00735"></a>00735 <span class="comment">  You can set the active flag by sending</span>
<a name="l00736"></a>00736 <span class="comment">  \verbatim /io/0/active 1 \endverbatim</span>
<a name="l00737"></a>00737 <span class="comment">*/</span>
<a name="l00738"></a>00738 
<a name="l00739"></a>00739 <span class="preprocessor">#include "osc.h"</span>
<a name="l00740"></a>00740 <span class="preprocessor">#include "string.h"</span>
<a name="l00741"></a>00741 <span class="preprocessor">#include "stdio.h"</span>
<a name="l00742"></a>00742 
<a name="l00743"></a>00743 <span class="comment">// Need a list of property names</span>
<a name="l00744"></a>00744 <span class="comment">// MUST end in zero</span>
<a name="l00745"></a>00745 <span class="keyword">static</span> <span class="keywordtype">char</span>* IoOsc_Name = <span class="stringliteral">"io"</span>;
<a name="l00746"></a>00746 <span class="keyword">static</span> <span class="keywordtype">char</span>* IoOsc_IndexIntPropertyNames[] = { <span class="stringliteral">"active"</span>, <span class="stringliteral">"value"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"pio"</span>, <span class="stringliteral">"pullup"</span>, 0 }; <span class="comment">// must have a trailing 0</span>
<a name="l00747"></a>00747 
<a name="l00748"></a>00748 <span class="keywordtype">int</span> IoOsc_IndexIntPropertySet( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> value );
<a name="l00749"></a>00749 <span class="keywordtype">int</span> IoOsc_IndexIntPropertyGet( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> property );
<a name="l00750"></a>00750 
<a name="l00751"></a>00751 <span class="keyword">static</span> <span class="keywordtype">char</span>* IoOsc_IntPropertyNames[] = { <span class="stringliteral">"porta"</span>, <span class="stringliteral">"portamask"</span>, <span class="stringliteral">"portb"</span>, <span class="stringliteral">"portbmask"</span>, 0 }; <span class="comment">// must have a trailing 0</span>
<a name="l00752"></a>00752 <span class="keywordtype">int</span> IoOsc_IntPropertySet( <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> value );
<a name="l00753"></a>00753 <span class="keywordtype">int</span> IoOsc_IntPropertyGet( <span class="keywordtype">int</span> property );
<a name="l00754"></a>00754 
<a name="l00755"></a>00755 <span class="comment">// Returns the name of the subsystem</span>
<a name="l00756"></a>00756 <span class="keyword">const</span> <span class="keywordtype">char</span>* IoOsc_GetName( )
<a name="l00757"></a>00757 {
<a name="l00758"></a>00758   <span class="keywordflow">return</span> IoOsc_Name;
<a name="l00759"></a>00759 }
<a name="l00760"></a>00760 
<a name="l00761"></a>00761 <span class="comment">// Now getting a message.  This is actually a part message, with the first</span>
<a name="l00762"></a>00762 <span class="comment">// part (the subsystem) already parsed off.</span>
<a name="l00763"></a>00763 <span class="keywordtype">int</span> IoOsc_ReceiveMessage( <span class="keywordtype">int</span> channel, <span class="keywordtype">char</span>* message, <span class="keywordtype">int</span> length )
<a name="l00764"></a>00764 {
<a name="l00765"></a>00765   <span class="keywordtype">int</span> status = <a class="code" href="group___o_s_c_a_p_i.html#gdaa5a3868eeedcf785c3d52f6b36ef34" title="Receive integers for a subsystem with multiple indexes.">Osc_IndexIntReceiverHelper</a>( channel, message, length, 
<a name="l00766"></a>00766                                            IO_PIN_COUNT, IoOsc_Name,
<a name="l00767"></a>00767                                            IoOsc_IndexIntPropertySet, IoOsc_IndexIntPropertyGet, 
<a name="l00768"></a>00768                                            IoOsc_IndexIntPropertyNames );
<a name="l00769"></a>00769                                      
<a name="l00770"></a>00770   <span class="keywordflow">if</span> ( status != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00771"></a>00771   {
<a name="l00772"></a>00772     status = <a class="code" href="group___o_s_c_a_p_i.html#g9331ca23d8e81ba91c4e728f0470627e" title="Receive an integer for a subsystem with no indexes.">Osc_IntReceiverHelper</a>( channel, message, length, 
<a name="l00773"></a>00773                                              IoOsc_Name,
<a name="l00774"></a>00774                                              IoOsc_IntPropertySet, IoOsc_IntPropertyGet, 
<a name="l00775"></a>00775                                              IoOsc_IntPropertyNames );
<a name="l00776"></a>00776   }
<a name="l00777"></a>00777                                      
<a name="l00778"></a>00778   <span class="keywordflow">if</span> ( status != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00779"></a>00779     <span class="keywordflow">return</span> Osc_SendError( channel, IoOsc_Name, status );
<a name="l00780"></a>00780   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00781"></a>00781 }
<a name="l00782"></a>00782 
<a name="l00783"></a>00783 <span class="comment">// Set the index, property with the value</span>
<a name="l00784"></a>00784 <span class="keywordtype">int</span> IoOsc_IndexIntPropertySet( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> value )
<a name="l00785"></a>00785 {
<a name="l00786"></a>00786   <span class="keywordflow">switch</span> ( property )
<a name="l00787"></a>00787   {
<a name="l00788"></a>00788     <span class="keywordflow">case</span> 0: 
<a name="l00789"></a>00789       <a class="code" href="group___io.html#g8a4becb6f3eeeb93849fa352633d40f2" title="Lock or release an IO line.">Io_SetActive</a>( index, value );
<a name="l00790"></a>00790       <span class="keywordflow">break</span>;      
<a name="l00791"></a>00791     <span class="keywordflow">case</span> 1: 
<a name="l00792"></a>00792       <a class="code" href="group___io.html#g31c976a85de4306c66be6b4c441d3892" title="Turn an IO line on or off.">Io_SetValue</a>( index, value );
<a name="l00793"></a>00793       <span class="keywordflow">break</span>;
<a name="l00794"></a>00794     <span class="keywordflow">case</span> 2:
<a name="l00795"></a>00795       <a class="code" href="group___io.html#gf836954ad8c7001e80d3c043a3c23a75" title="Set whether an IO line is an output or an input.">Io_SetDirection</a>( index, value );
<a name="l00796"></a>00796       <span class="keywordflow">break</span>;
<a name="l00797"></a>00797     <span class="keywordflow">case</span> 3:
<a name="l00798"></a>00798       Io_SetPio( index, value );
<a name="l00799"></a>00799       <span class="keywordflow">break</span>;
<a name="l00800"></a>00800     <span class="keywordflow">case</span> 4:
<a name="l00801"></a>00801       <a class="code" href="group___io.html#g3ff4308d5768d83b4f2fe153576fc21e" title="Set the pullup resistor for an IO line on or off.">Io_SetPullup</a>( index, value );
<a name="l00802"></a>00802       <span class="keywordflow">break</span>;  }
<a name="l00803"></a>00803   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00804"></a>00804 }
<a name="l00805"></a>00805 
<a name="l00806"></a>00806 <span class="comment">// Get the indexed property</span>
<a name="l00807"></a>00807 <span class="keywordtype">int</span> IoOsc_IndexIntPropertyGet( <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> property )
<a name="l00808"></a>00808 {
<a name="l00809"></a>00809   <span class="keywordtype">int</span> value = 0;
<a name="l00810"></a>00810   <span class="keywordflow">switch</span> ( property )
<a name="l00811"></a>00811   {
<a name="l00812"></a>00812     <span class="keywordflow">case</span> 0:
<a name="l00813"></a>00813       value = Io_GetActive( index );
<a name="l00814"></a>00814       <span class="keywordflow">break</span>;
<a name="l00815"></a>00815     <span class="keywordflow">case</span> 1:
<a name="l00816"></a>00816       value = <a class="code" href="group___io.html#gfdcf7332d0ae5b38d2a776fb6cc5ba7b" title="Read whether an IO line, presumably set as an output, is on or off.">Io_GetValue</a>( index );
<a name="l00817"></a>00817       <span class="keywordflow">break</span>;
<a name="l00818"></a>00818     <span class="keywordflow">case</span> 2:
<a name="l00819"></a>00819       value = <a class="code" href="group___io.html#g068a4b07b47f9c71d39d1f88ed50ba64" title="Read whether an IO line is an output or an input.">Io_GetDirection</a>( index );
<a name="l00820"></a>00820       <span class="keywordflow">break</span>;
<a name="l00821"></a>00821     <span class="keywordflow">case</span> 3:
<a name="l00822"></a>00822       value = Io_GetPio( index );
<a name="l00823"></a>00823       <span class="keywordflow">break</span>;
<a name="l00824"></a>00824     <span class="keywordflow">case</span> 4:
<a name="l00825"></a>00825       value = <a class="code" href="group___io.html#gea14ac73a96c7c5ede5313532fcd35d7" title="Read whether the pullup resistor for an IO line on or off.">Io_GetPullup</a>( index );
<a name="l00826"></a>00826       <span class="keywordflow">break</span>;
<a name="l00827"></a>00827   }
<a name="l00828"></a>00828   
<a name="l00829"></a>00829   <span class="keywordflow">return</span> value;
<a name="l00830"></a>00830 }
<a name="l00831"></a>00831 
<a name="l00832"></a>00832 
<a name="l00833"></a>00833 <span class="comment">// Set the property with the value</span>
<a name="l00834"></a>00834 <span class="keywordtype">int</span> IoOsc_IntPropertySet( <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> value )
<a name="l00835"></a>00835 {
<a name="l00836"></a>00836   <span class="keywordflow">switch</span> ( property )
<a name="l00837"></a>00837   {
<a name="l00838"></a>00838     <span class="keywordflow">case</span> 0: 
<a name="l00839"></a>00839       Io_SetPortA( value );
<a name="l00840"></a>00840       <span class="keywordflow">break</span>;      
<a name="l00841"></a>00841     <span class="keywordflow">case</span> 1: 
<a name="l00842"></a>00842       Io_SetPortAMask( value );
<a name="l00843"></a>00843       <span class="keywordflow">break</span>;
<a name="l00844"></a>00844     <span class="keywordflow">case</span> 2: 
<a name="l00845"></a>00845       Io_SetPortB( value );
<a name="l00846"></a>00846       <span class="keywordflow">break</span>;      
<a name="l00847"></a>00847     <span class="keywordflow">case</span> 3: 
<a name="l00848"></a>00848       Io_SetPortBMask( value );
<a name="l00849"></a>00849       <span class="keywordflow">break</span>;      
<a name="l00850"></a>00850   }
<a name="l00851"></a>00851   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00852"></a>00852 }
<a name="l00853"></a>00853 
<a name="l00854"></a>00854 <span class="comment">// Get the indexed property</span>
<a name="l00855"></a>00855 <span class="keywordtype">int</span> IoOsc_IntPropertyGet( <span class="keywordtype">int</span> property )
<a name="l00856"></a>00856 {
<a name="l00857"></a>00857   <span class="keywordtype">int</span> value = 0;
<a name="l00858"></a>00858   <span class="keywordflow">switch</span> ( property )
<a name="l00859"></a>00859   {
<a name="l00860"></a>00860     <span class="keywordflow">case</span> 0: 
<a name="l00861"></a>00861       value = Io_GetPortA(  );
<a name="l00862"></a>00862       <span class="keywordflow">break</span>;      
<a name="l00863"></a>00863     <span class="keywordflow">case</span> 1: 
<a name="l00864"></a>00864       value = Io_GetPortAMask(  );
<a name="l00865"></a>00865       <span class="keywordflow">break</span>;
<a name="l00866"></a>00866     <span class="keywordflow">case</span> 2: 
<a name="l00867"></a>00867       value = Io_GetPortB(  );
<a name="l00868"></a>00868       <span class="keywordflow">break</span>;      
<a name="l00869"></a>00869     <span class="keywordflow">case</span> 3: 
<a name="l00870"></a>00870       value = Io_GetPortBMask( );
<a name="l00871"></a>00871       <span class="keywordflow">break</span>;
<a name="l00872"></a>00872   }
<a name="l00873"></a>00873   <span class="keywordflow">return</span> value;
<a name="l00874"></a>00874 }
<a name="l00875"></a>00875 
<a name="l00876"></a>00876 <span class="preprocessor">#endif</span>
<a name="l00877"></a>00877 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00878"></a>00878 <span class="comment">/** </span>
<a name="l00879"></a>00879 <span class="comment">  Io_Test.</span>
<a name="l00880"></a>00880 <span class="comment">  Tests the IO routines.  Also tests the initial state, so should be called before</span>
<a name="l00881"></a>00881 <span class="comment">  any Io routines are called.</span>
<a name="l00882"></a>00882 <span class="comment">  @return status - CONTROLLER_OK (0) for all OK, or an error code</span>
<a name="l00883"></a>00883 <span class="comment">*/</span>
<a name="l00884"></a>00884 <span class="comment">/*</span>
<a name="l00885"></a>00885 <span class="comment">int Io_Test()</span>
<a name="l00886"></a>00886 <span class="comment">{</span>
<a name="l00887"></a>00887 <span class="comment">  int status;</span>
<a name="l00888"></a>00888 <span class="comment"></span>
<a name="l00889"></a>00889 <span class="comment">  // Check the data structure</span>
<a name="l00890"></a>00890 <span class="comment">  status = Io_TestDataStructure();</span>
<a name="l00891"></a>00891 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00892"></a>00892 <span class="comment">    return status;</span>
<a name="l00893"></a>00893 <span class="comment"></span>
<a name="l00894"></a>00894 <span class="comment">  // Check the initial state of the sub-system</span>
<a name="l00895"></a>00895 <span class="comment">  status = Io_TestInitialState();</span>
<a name="l00896"></a>00896 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00897"></a>00897 <span class="comment">    return status;</span>
<a name="l00898"></a>00898 <span class="comment"></span>
<a name="l00899"></a>00899 <span class="comment">  // Check to make sure Io pins can be started and stopped correctly</span>
<a name="l00900"></a>00900 <span class="comment">  status = Io_TestStartStop();</span>
<a name="l00901"></a>00901 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00902"></a>00902 <span class="comment">    return status;</span>
<a name="l00903"></a>00903 <span class="comment"></span>
<a name="l00904"></a>00904 <span class="comment">  // Check to make sure Io pins can be started and stopped correctly using BITS</span>
<a name="l00905"></a>00905 <span class="comment">  status = Io_TestStartStopBits();</span>
<a name="l00906"></a>00906 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00907"></a>00907 <span class="comment">    return status;</span>
<a name="l00908"></a>00908 <span class="comment"></span>
<a name="l00909"></a>00909 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l00910"></a>00910 <span class="comment">}</span>
<a name="l00911"></a>00911 <span class="comment"></span>
<a name="l00912"></a>00912 <span class="comment">int Io_TestDataStructure()</span>
<a name="l00913"></a>00913 <span class="comment">{</span>
<a name="l00914"></a>00914 <span class="comment">  // Check for correct packing</span>
<a name="l00915"></a>00915 <span class="comment">  int s = sizeof( struct Io_ ); </span>
<a name="l00916"></a>00916 <span class="comment">  if ( s != IO_PIN_COUNT + 8 )</span>
<a name="l00917"></a>00917 <span class="comment">    return CONTROLLER_ERROR_DATA_STRUCTURE_SIZE_WRONG;</span>
<a name="l00918"></a>00918 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l00919"></a>00919 <span class="comment">}</span>
<a name="l00920"></a>00920 <span class="comment"></span>
<a name="l00921"></a>00921 <span class="comment">int Io_TestInitialState()</span>
<a name="l00922"></a>00922 <span class="comment">{  </span>
<a name="l00923"></a>00923 <span class="comment">  int status;</span>
<a name="l00924"></a>00924 <span class="comment"></span>
<a name="l00925"></a>00925 <span class="comment">  // Total init count is zero</span>
<a name="l00926"></a>00926 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l00927"></a>00927 <span class="comment">    return CONTROLLER_ERROR_INITIALIZATION;</span>
<a name="l00928"></a>00928 <span class="comment"></span>
<a name="l00929"></a>00929 <span class="comment">  // Total user count is zero</span>
<a name="l00930"></a>00930 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l00931"></a>00931 <span class="comment">    return CONTROLLER_ERROR_INITIALIZATION;</span>
<a name="l00932"></a>00932 <span class="comment"></span>
<a name="l00933"></a>00933 <span class="comment">  // Each pin's user count and lock status is where it should be</span>
<a name="l00934"></a>00934 <span class="comment">  status = Io_TestPins( 0, false );</span>
<a name="l00935"></a>00935 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00936"></a>00936 <span class="comment">    return status;</span>
<a name="l00937"></a>00937 <span class="comment"></span>
<a name="l00938"></a>00938 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l00939"></a>00939 <span class="comment">}</span>
<a name="l00940"></a>00940 <span class="comment"></span>
<a name="l00941"></a>00941 <span class="comment">int Io_TestStartStop()</span>
<a name="l00942"></a>00942 <span class="comment">{</span>
<a name="l00943"></a>00943 <span class="comment">  int status;</span>
<a name="l00944"></a>00944 <span class="comment">  int i;</span>
<a name="l00945"></a>00945 <span class="comment"></span>
<a name="l00946"></a>00946 <span class="comment">  //</span>
<a name="l00947"></a>00947 <span class="comment">  // Start/Stop Test - first no lock</span>
<a name="l00948"></a>00948 <span class="comment">  //</span>
<a name="l00949"></a>00949 <span class="comment"></span>
<a name="l00950"></a>00950 <span class="comment">  // Start with no lock</span>
<a name="l00951"></a>00951 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l00952"></a>00952 <span class="comment">  {</span>
<a name="l00953"></a>00953 <span class="comment">    if ( Io_Start( i, false ) != CONTROLLER_OK )</span>
<a name="l00954"></a>00954 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l00955"></a>00955 <span class="comment">  }</span>
<a name="l00956"></a>00956 <span class="comment"></span>
<a name="l00957"></a>00957 <span class="comment">  // Attempt to start the new pins again</span>
<a name="l00958"></a>00958 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l00959"></a>00959 <span class="comment">  {</span>
<a name="l00960"></a>00960 <span class="comment">    if ( Io_Start( i, false ) != CONTROLLER_OK )</span>
<a name="l00961"></a>00961 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l00962"></a>00962 <span class="comment">  }</span>
<a name="l00963"></a>00963 <span class="comment"></span>
<a name="l00964"></a>00964 <span class="comment">  // Make sure the init code has only been run once</span>
<a name="l00965"></a>00965 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l00966"></a>00966 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l00967"></a>00967 <span class="comment"></span>
<a name="l00968"></a>00968 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l00969"></a>00969 <span class="comment">  if ( Io.users != IO_PIN_COUNT * 2 )</span>
<a name="l00970"></a>00970 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l00971"></a>00971 <span class="comment"></span>
<a name="l00972"></a>00972 <span class="comment">  // Check each pin record to make sure there' are two users there  </span>
<a name="l00973"></a>00973 <span class="comment">  status = Io_TestPins( 2, false );</span>
<a name="l00974"></a>00974 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l00975"></a>00975 <span class="comment">    return status;</span>
<a name="l00976"></a>00976 <span class="comment"></span>
<a name="l00977"></a>00977 <span class="comment"></span>
<a name="l00978"></a>00978 <span class="comment">  // Now try to stop all the pins</span>
<a name="l00979"></a>00979 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l00980"></a>00980 <span class="comment">  {</span>
<a name="l00981"></a>00981 <span class="comment">    if ( Io_Stop( i ) != CONTROLLER_OK )</span>
<a name="l00982"></a>00982 <span class="comment">      return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l00983"></a>00983 <span class="comment">  }</span>
<a name="l00984"></a>00984 <span class="comment"></span>
<a name="l00985"></a>00985 <span class="comment">  // Now try to stop all the pins again</span>
<a name="l00986"></a>00986 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l00987"></a>00987 <span class="comment">  {</span>
<a name="l00988"></a>00988 <span class="comment">    if ( Io_Stop( i ) != CONTROLLER_OK )</span>
<a name="l00989"></a>00989 <span class="comment">      return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l00990"></a>00990 <span class="comment">  }</span>
<a name="l00991"></a>00991 <span class="comment"></span>
<a name="l00992"></a>00992 <span class="comment">  // Make sure the module de-initialized</span>
<a name="l00993"></a>00993 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l00994"></a>00994 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_DEINIT;</span>
<a name="l00995"></a>00995 <span class="comment"></span>
<a name="l00996"></a>00996 <span class="comment">  // Make sure the users are back to zero</span>
<a name="l00997"></a>00997 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l00998"></a>00998 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l00999"></a>00999 <span class="comment"></span>
<a name="l01000"></a>01000 <span class="comment">  // Make sure each pin is back to zero</span>
<a name="l01001"></a>01001 <span class="comment">  status = Io_TestPins( 0, false );</span>
<a name="l01002"></a>01002 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01003"></a>01003 <span class="comment">    return status;</span>
<a name="l01004"></a>01004 <span class="comment"></span>
<a name="l01005"></a>01005 <span class="comment">  //</span>
<a name="l01006"></a>01006 <span class="comment">  // Start/Stop Test - with lock</span>
<a name="l01007"></a>01007 <span class="comment">  //</span>
<a name="l01008"></a>01008 <span class="comment"></span>
<a name="l01009"></a>01009 <span class="comment">  // Start with starting each pin</span>
<a name="l01010"></a>01010 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l01011"></a>01011 <span class="comment">  {</span>
<a name="l01012"></a>01012 <span class="comment">    if ( Io_Start( i, true ) != CONTROLLER_OK )</span>
<a name="l01013"></a>01013 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l01014"></a>01014 <span class="comment">  }</span>
<a name="l01015"></a>01015 <span class="comment"></span>
<a name="l01016"></a>01016 <span class="comment">  // Make sure the init code has been run again</span>
<a name="l01017"></a>01017 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01018"></a>01018 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01019"></a>01019 <span class="comment"></span>
<a name="l01020"></a>01020 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l01021"></a>01021 <span class="comment">  if ( Io.users != IO_PIN_COUNT )</span>
<a name="l01022"></a>01022 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01023"></a>01023 <span class="comment"></span>
<a name="l01024"></a>01024 <span class="comment">  // Check each pin record to make sure there's one locked user</span>
<a name="l01025"></a>01025 <span class="comment">  status = Io_TestPins( 1, true );</span>
<a name="l01026"></a>01026 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01027"></a>01027 <span class="comment">    return status;</span>
<a name="l01028"></a>01028 <span class="comment"></span>
<a name="l01029"></a>01029 <span class="comment">  // Now try to use them - no lock, shouldn't work</span>
<a name="l01030"></a>01030 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l01031"></a>01031 <span class="comment">  {</span>
<a name="l01032"></a>01032 <span class="comment">    if ( Io_Start( i, false ) == CONTROLLER_OK )</span>
<a name="l01033"></a>01033 <span class="comment">      return CONTROLLER_ERROR_USE_GRANTED_ERROR;</span>
<a name="l01034"></a>01034 <span class="comment">  }</span>
<a name="l01035"></a>01035 <span class="comment"></span>
<a name="l01036"></a>01036 <span class="comment">  // Now try to use them - with lock, shouldn't work</span>
<a name="l01037"></a>01037 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l01038"></a>01038 <span class="comment">  {</span>
<a name="l01039"></a>01039 <span class="comment">    if ( Io_Start( i, true ) == CONTROLLER_OK )</span>
<a name="l01040"></a>01040 <span class="comment">      return CONTROLLER_ERROR_LOCK_GRANTED_ERROR;</span>
<a name="l01041"></a>01041 <span class="comment">  }</span>
<a name="l01042"></a>01042 <span class="comment"></span>
<a name="l01043"></a>01043 <span class="comment">  // Now try to stop all the pins again</span>
<a name="l01044"></a>01044 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l01045"></a>01045 <span class="comment">  {</span>
<a name="l01046"></a>01046 <span class="comment">    if ( Io_Stop( i ) != CONTROLLER_OK )</span>
<a name="l01047"></a>01047 <span class="comment">      return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l01048"></a>01048 <span class="comment">  }</span>
<a name="l01049"></a>01049 <span class="comment"></span>
<a name="l01050"></a>01050 <span class="comment">  // Make sure the module de-initialized</span>
<a name="l01051"></a>01051 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l01052"></a>01052 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_DEINIT;</span>
<a name="l01053"></a>01053 <span class="comment"></span>
<a name="l01054"></a>01054 <span class="comment">  // Make sure the users are back to zero</span>
<a name="l01055"></a>01055 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l01056"></a>01056 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01057"></a>01057 <span class="comment"></span>
<a name="l01058"></a>01058 <span class="comment">  // Make sure each pin is back to zero and not locked</span>
<a name="l01059"></a>01059 <span class="comment">  status = Io_TestPins( 0, false );</span>
<a name="l01060"></a>01060 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01061"></a>01061 <span class="comment">    return status;</span>
<a name="l01062"></a>01062 <span class="comment"></span>
<a name="l01063"></a>01063 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l01064"></a>01064 <span class="comment">}</span>
<a name="l01065"></a>01065 <span class="comment"></span>
<a name="l01066"></a>01066 <span class="comment">int Io_TestStartStopBits()</span>
<a name="l01067"></a>01067 <span class="comment">{</span>
<a name="l01068"></a>01068 <span class="comment">  int status;</span>
<a name="l01069"></a>01069 <span class="comment"></span>
<a name="l01070"></a>01070 <span class="comment">  //</span>
<a name="l01071"></a>01071 <span class="comment">  // Start/Stop Bits Test - first no lock</span>
<a name="l01072"></a>01072 <span class="comment">  //</span>
<a name="l01073"></a>01073 <span class="comment">  llong all = 0xFFFFFFFFFFFFFFFFLL;</span>
<a name="l01074"></a>01074 <span class="comment">  //llong half1 = 0x00000000FFFFFFFFLL;</span>
<a name="l01075"></a>01075 <span class="comment">  //llong half2 = 0xFFFFFFFF00000000LL;</span>
<a name="l01076"></a>01076 <span class="comment"></span>
<a name="l01077"></a>01077 <span class="comment">  // Start with no lock</span>
<a name="l01078"></a>01078 <span class="comment">  if ( Io_StartBits( all, false ) != CONTROLLER_OK )</span>
<a name="l01079"></a>01079 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l01080"></a>01080 <span class="comment"></span>
<a name="l01081"></a>01081 <span class="comment">  // Start again</span>
<a name="l01082"></a>01082 <span class="comment">  if ( Io_StartBits( all, false ) != CONTROLLER_OK )</span>
<a name="l01083"></a>01083 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l01084"></a>01084 <span class="comment"></span>
<a name="l01085"></a>01085 <span class="comment">  // Make sure the init code has only been run once</span>
<a name="l01086"></a>01086 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01087"></a>01087 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01088"></a>01088 <span class="comment"></span>
<a name="l01089"></a>01089 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l01090"></a>01090 <span class="comment">  if ( Io.users != IO_PIN_COUNT * 2 )</span>
<a name="l01091"></a>01091 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01092"></a>01092 <span class="comment"></span>
<a name="l01093"></a>01093 <span class="comment">  // Check each pin record to make sure there' are two users there  </span>
<a name="l01094"></a>01094 <span class="comment">  status = Io_TestPins( 2, false );</span>
<a name="l01095"></a>01095 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01096"></a>01096 <span class="comment">    return status;</span>
<a name="l01097"></a>01097 <span class="comment"></span>
<a name="l01098"></a>01098 <span class="comment">  // Now try to stop all the pins</span>
<a name="l01099"></a>01099 <span class="comment">  if ( Io_StopBits( all ) != CONTROLLER_OK )</span>
<a name="l01100"></a>01100 <span class="comment">    return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l01101"></a>01101 <span class="comment"></span>
<a name="l01102"></a>01102 <span class="comment">  // Now try to stop all the pins again</span>
<a name="l01103"></a>01103 <span class="comment">  if ( Io_StopBits( all ) != CONTROLLER_OK )</span>
<a name="l01104"></a>01104 <span class="comment">    return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l01105"></a>01105 <span class="comment"></span>
<a name="l01106"></a>01106 <span class="comment">  // Make sure the module de-initialized</span>
<a name="l01107"></a>01107 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l01108"></a>01108 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_DEINIT;</span>
<a name="l01109"></a>01109 <span class="comment"></span>
<a name="l01110"></a>01110 <span class="comment">  // Make sure the users are back to zero</span>
<a name="l01111"></a>01111 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l01112"></a>01112 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01113"></a>01113 <span class="comment"></span>
<a name="l01114"></a>01114 <span class="comment">  // Make sure each pin is back to zero</span>
<a name="l01115"></a>01115 <span class="comment">  status = Io_TestPins( 0, false );</span>
<a name="l01116"></a>01116 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01117"></a>01117 <span class="comment">    return status;</span>
<a name="l01118"></a>01118 <span class="comment"></span>
<a name="l01119"></a>01119 <span class="comment">  //</span>
<a name="l01120"></a>01120 <span class="comment">  // Start/Stop Bits Test - with lock</span>
<a name="l01121"></a>01121 <span class="comment">  //</span>
<a name="l01122"></a>01122 <span class="comment"></span>
<a name="l01123"></a>01123 <span class="comment">  // Start with starting each pin</span>
<a name="l01124"></a>01124 <span class="comment">  if ( Io_StartBits( all, true ) != CONTROLLER_OK )</span>
<a name="l01125"></a>01125 <span class="comment">      return CONTROLLER_ERROR_START_FAILED;</span>
<a name="l01126"></a>01126 <span class="comment"></span>
<a name="l01127"></a>01127 <span class="comment">  // Make sure the init code has been run again</span>
<a name="l01128"></a>01128 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01129"></a>01129 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01130"></a>01130 <span class="comment"></span>
<a name="l01131"></a>01131 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l01132"></a>01132 <span class="comment">  if ( Io.users != IO_PIN_COUNT )</span>
<a name="l01133"></a>01133 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01134"></a>01134 <span class="comment"></span>
<a name="l01135"></a>01135 <span class="comment">  // Check each pin record to make sure there's one locked user</span>
<a name="l01136"></a>01136 <span class="comment">  status = Io_TestPins( 1, true );</span>
<a name="l01137"></a>01137 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01138"></a>01138 <span class="comment">    return status;</span>
<a name="l01139"></a>01139 <span class="comment"></span>
<a name="l01140"></a>01140 <span class="comment">  // Now try to use them - no lock, shouldn't work</span>
<a name="l01141"></a>01141 <span class="comment">  if ( Io_StartBits( all, false ) == CONTROLLER_OK )</span>
<a name="l01142"></a>01142 <span class="comment">    return CONTROLLER_ERROR_LOCK_GRANTED_ERROR;</span>
<a name="l01143"></a>01143 <span class="comment"></span>
<a name="l01144"></a>01144 <span class="comment">  // Now try to use them - with lock, shouldn't work</span>
<a name="l01145"></a>01145 <span class="comment">  if ( Io_StartBits( all, true ) == CONTROLLER_OK )</span>
<a name="l01146"></a>01146 <span class="comment">    return CONTROLLER_ERROR_LOCK_GRANTED_ERROR;</span>
<a name="l01147"></a>01147 <span class="comment"></span>
<a name="l01148"></a>01148 <span class="comment">  // Now try to stop all the pins again</span>
<a name="l01149"></a>01149 <span class="comment">  if ( Io_StopBits( all ) != CONTROLLER_OK )</span>
<a name="l01150"></a>01150 <span class="comment">    return CONTROLLER_ERROR_STOP_FAILED;</span>
<a name="l01151"></a>01151 <span class="comment"></span>
<a name="l01152"></a>01152 <span class="comment">  // Make sure the module de-initialized</span>
<a name="l01153"></a>01153 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l01154"></a>01154 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_DEINIT;</span>
<a name="l01155"></a>01155 <span class="comment"></span>
<a name="l01156"></a>01156 <span class="comment">  // Make sure the users are back to zero</span>
<a name="l01157"></a>01157 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l01158"></a>01158 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01159"></a>01159 <span class="comment"></span>
<a name="l01160"></a>01160 <span class="comment">  // Make sure each pin is back to zero and not locked</span>
<a name="l01161"></a>01161 <span class="comment">  status = Io_TestPins( 0, false );</span>
<a name="l01162"></a>01162 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01163"></a>01163 <span class="comment">    return status;</span>
<a name="l01164"></a>01164 <span class="comment"></span>
<a name="l01165"></a>01165 <span class="comment">  // </span>
<a name="l01166"></a>01166 <span class="comment">  // Check individual bits and unwind on error</span>
<a name="l01167"></a>01167 <span class="comment">  //</span>
<a name="l01168"></a>01168 <span class="comment"></span>
<a name="l01169"></a>01169 <span class="comment">  status = Io_StartBits( 3LL&lt;&lt;19, false );</span>
<a name="l01170"></a>01170 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01171"></a>01171 <span class="comment">    return status;</span>
<a name="l01172"></a>01172 <span class="comment"></span>
<a name="l01173"></a>01173 <span class="comment">  // Make sure the init code has been run again</span>
<a name="l01174"></a>01174 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01175"></a>01175 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01176"></a>01176 <span class="comment"></span>
<a name="l01177"></a>01177 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l01178"></a>01178 <span class="comment">  if ( Io.users != 2 )</span>
<a name="l01179"></a>01179 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01180"></a>01180 <span class="comment"></span>
<a name="l01181"></a>01181 <span class="comment">  // try to lock them all up - lock blocking, shouldn't work</span>
<a name="l01182"></a>01182 <span class="comment">  if ( Io_StartBits( all, true ) == CONTROLLER_OK )</span>
<a name="l01183"></a>01183 <span class="comment">    return CONTROLLER_ERROR_LOCK_GRANTED_ERROR;</span>
<a name="l01184"></a>01184 <span class="comment"></span>
<a name="l01185"></a>01185 <span class="comment">  // Make sure the code is still inited</span>
<a name="l01186"></a>01186 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01187"></a>01187 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01188"></a>01188 <span class="comment"></span>
<a name="l01189"></a>01189 <span class="comment">  // Make sure the global user count is equal to the number of starts</span>
<a name="l01190"></a>01190 <span class="comment">  if ( Io.users != 2 )</span>
<a name="l01191"></a>01191 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01192"></a>01192 <span class="comment"></span>
<a name="l01193"></a>01193 <span class="comment">  // Turn the one bit off</span>
<a name="l01194"></a>01194 <span class="comment">  status = Io_StopBits( 3LL&lt;&lt;19 );</span>
<a name="l01195"></a>01195 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01196"></a>01196 <span class="comment">    return status;</span>
<a name="l01197"></a>01197 <span class="comment"></span>
<a name="l01198"></a>01198 <span class="comment">  // Make sure the code is un-inited</span>
<a name="l01199"></a>01199 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l01200"></a>01200 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01201"></a>01201 <span class="comment"></span>
<a name="l01202"></a>01202 <span class="comment">  // Make sure the global user count is zero</span>
<a name="l01203"></a>01203 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l01204"></a>01204 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01205"></a>01205 <span class="comment"></span>
<a name="l01206"></a>01206 <span class="comment">  status = Io_StartBits( 3LL&lt;&lt;19, true );</span>
<a name="l01207"></a>01207 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01208"></a>01208 <span class="comment">    return status;</span>
<a name="l01209"></a>01209 <span class="comment">  </span>
<a name="l01210"></a>01210 <span class="comment">  // try to lock them all up - lock blocking, shouldn't work</span>
<a name="l01211"></a>01211 <span class="comment">  if ( Io_StartBits( all, true ) == CONTROLLER_OK )</span>
<a name="l01212"></a>01212 <span class="comment">    return CONTROLLER_ERROR_LOCK_GRANTED_ERROR;</span>
<a name="l01213"></a>01213 <span class="comment"></span>
<a name="l01214"></a>01214 <span class="comment">  // Make sure the code is still inited</span>
<a name="l01215"></a>01215 <span class="comment">  if ( Io.init != 1 )</span>
<a name="l01216"></a>01216 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01217"></a>01217 <span class="comment"></span>
<a name="l01218"></a>01218 <span class="comment">  // Make sure the global user count is equal to the number of correct starts</span>
<a name="l01219"></a>01219 <span class="comment">  if ( Io.users != 2 )</span>
<a name="l01220"></a>01220 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01221"></a>01221 <span class="comment"></span>
<a name="l01222"></a>01222 <span class="comment">  // Turn the bits off</span>
<a name="l01223"></a>01223 <span class="comment">  status = Io_StopBits( 3LL&lt;&lt;19 );</span>
<a name="l01224"></a>01224 <span class="comment">  if ( status != CONTROLLER_OK )</span>
<a name="l01225"></a>01225 <span class="comment">    return status;</span>
<a name="l01226"></a>01226 <span class="comment"></span>
<a name="l01227"></a>01227 <span class="comment">  // Make sure the code is un-inited</span>
<a name="l01228"></a>01228 <span class="comment">  if ( Io.init != 0 )</span>
<a name="l01229"></a>01229 <span class="comment">    return CONTROLLER_ERROR_INCORRECT_INIT;</span>
<a name="l01230"></a>01230 <span class="comment"></span>
<a name="l01231"></a>01231 <span class="comment">  // Make sure the global user count is zero</span>
<a name="l01232"></a>01232 <span class="comment">  if ( Io.users != 0 )</span>
<a name="l01233"></a>01233 <span class="comment">    return CONTROLLER_ERROR_COUNT_MISMATCH;</span>
<a name="l01234"></a>01234 <span class="comment"></span>
<a name="l01235"></a>01235 <span class="comment"></span>
<a name="l01236"></a>01236 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l01237"></a>01237 <span class="comment">}</span>
<a name="l01238"></a>01238 <span class="comment"></span>
<a name="l01239"></a>01239 <span class="comment">int Io_TestPins( short users, bool lock )</span>
<a name="l01240"></a>01240 <span class="comment">{</span>
<a name="l01241"></a>01241 <span class="comment">  // Make sure each pin is correct</span>
<a name="l01242"></a>01242 <span class="comment">  IoPin* p = &amp;Io.pins[ 0 ];</span>
<a name="l01243"></a>01243 <span class="comment">  int i;</span>
<a name="l01244"></a>01244 <span class="comment">  for ( i = 0; i &lt; IO_PIN_COUNT; i++ )</span>
<a name="l01245"></a>01245 <span class="comment">  {</span>
<a name="l01246"></a>01246 <span class="comment">    if ( p-&gt;users != users )</span>
<a name="l01247"></a>01247 <span class="comment">      return CONTROLLER_ERROR_WRONG_USER_COUNT;</span>
<a name="l01248"></a>01248 <span class="comment">    if ( p-&gt;lock != lock )</span>
<a name="l01249"></a>01249 <span class="comment">      return CONTROLLER_ERROR_LOCK_ERROR;</span>
<a name="l01250"></a>01250 <span class="comment">  }</span>
<a name="l01251"></a>01251 <span class="comment"></span>
<a name="l01252"></a>01252 <span class="comment">  return CONTROLLER_OK;</span>
<a name="l01253"></a>01253 <span class="comment">}</span>
<a name="l01254"></a>01254 <span class="comment">*/</span>
</pre></div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit</title>
<style type="text/css">
<!--
.footer {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 9pt;
	color: #999999;
}
-->
</style>
</head>

<body>
<hr size="1">
<div>
  <p class="footer">The Make Controller Kit is an open source project maintained by <a href="http://www.makingthings.com">MakingThings</a>.<br />
    MakingThings code is released under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">Apache 2.0 license</a>.<br />
    Bug tracker, development wiki and status can be found at <a href="http://dev.makingthings.com">http://dev.makingthings.com</a>.<br />
		This document was last updated on 5 Dec 2007.
</p>
</div>
<!-- Google Analytics Code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-769030-1";
urchinTracker();
</script>
</body>
</html>
